package algorithm.linkedlist;

/**
 * 反转单链表 LC206
 *
 * @author 杨 强
 * @package algorithm.linkedlist
 * @createTime 2023-03-09 21:40
 */
public class Reversal {
    public static void main(String[] args) {
        // 定义一个链表[1,2,3,4,5]
        ListNode o5 = new ListNode(5, null);
        ListNode o4 = new ListNode(4, o5);
        ListNode o3 = new ListNode(3, o4);
        ListNode o2 = new ListNode(2, o3);
        ListNode o1 = new ListNode(1, o2);
        System.out.println(o1);
        // 反转链表并返回头部节点
        ListNode n1 = reversal01(o1);
        System.out.println(n1);
    }

    /**
     * 复制法反转链表
     * @param o1 需要反转链表的头部节点
     * @return 反转后的头部节点
     */
    private static ListNode reversal01(ListNode o1) {
        // 定义一个新的链表的头部节点
        ListNode n1 = null;

        // 循环需要反转的链表, 把链表值插入到新链表的尾部
        ListNode o = o1;
        while (o != null){
            // 插入新链表的尾部, 并且把新增的节点作为新的头结点.
            n1 = new ListNode(o.val, n1);
            // 循环下一个节点
            o = o.next;
        }
        // 返回新链表的头部节点
        return n1;
    }
}
